/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.ipartek.formacion.gestformwww.modelo.clases;

import com.ipartek.formacion.gestformwww.modelo.beans.Empresa;
import com.ipartek.formacion.gestformwww.modelo.beans.excepciones.GestorFormacionExcepcion;
import com.ipartek.formacion.gestformwww.modelo.interfaces.IEmpresaDAO;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * @author Sara y Alvaro
 */
public class SQLServerEmpresaDAO implements IEmpresaDAO {

    private static ResourceBundle rb;

    public SQLServerEmpresaDAO() {
        rb = ResourceBundle.getBundle("com.ipartek.formacion.gestformwww.controlador.excepciones");
    }

    /**
     * Método que crea los tipos de cursos.
     * @author
     * @param rs: ResultSet obtenido de una consulta SQL.
     * @return Devuelve un tipo de curso de la clase tipoCurso
     */
    private Empresa instanciarEmpresa(ResultSet rs) throws SQLException {
        Empresa empresa = new Empresa();
        empresa.setEmpId(rs.getInt("EmpId"));
        empresa.setEmpCIF(rs.getString("EmpCIF"));
        empresa.setEmpDir(rs.getString("EmpDir"));
        empresa.setEmpTlf1(rs.getString("EmpTlf1"));
        empresa.setEmpTlf2(rs.getString("EmpTlf2"));
        empresa.setEmpMail(rs.getString("EmpMail"));
        empresa.setEmpWeb(rs.getString("EmpWeb"));
        empresa.setEmpNom(rs.getString("EmpNom"));
        empresa.setEmpObserv(rs.getString("EmpObserv"));

        return empresa;
    }

    /**
     * Metodo que crea una nueva empresa en la tabla con los datos establecidos.
     * @author Sara y Alvaro
     * @param emp Contiene los datos de la nueva empresa.
     * @return Devuelve el identificador de la empresa creada.
     */
    public Integer crearEmpresa(Empresa emp) throws GestorFormacionExcepcion{
        Connection con;
        SentenciaNula stmt=null;
        ResultSet rs=null;
        Integer idEmpresa = null;

        try {
            con = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerEmpresaDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }

        try{
            stmt = new SentenciaNula(con, "SELECT EmpId FROM empresa WHERE EmpNom=?");
            stmt.setString(1, emp.getEmpNom());
            rs=stmt.executeQuery();
            if(!rs.next()){
                stmt = new SentenciaNula(con, "INSERT INTO Empresa (EmpCIF, EmpDir, EmpTlf1, EmpTlf2, EmpMail, EmpWeb, EmpNom, EmpObserv)VALUES (?,?,?,?,?,?,?,?)", Statement.RETURN_GENERATED_KEYS);
                stmt.setString(1, emp.getEmpCIF());
                stmt.setString(2, emp.getEmpDir());
                stmt.setString(3, emp.getEmpTlf1());
                stmt.setString(4, emp.getEmpTlf2());
                stmt.setString(5, emp.getEmpMail());
                stmt.setString(6, emp.getEmpWeb());
                stmt.setString(7, emp.getEmpNom());
                stmt.setString(8, emp.getEmpObserv());
                stmt.executeUpdate();
                rs = stmt.getGeneratedKeys();
                if (rs.next()) {
                    idEmpresa = new Integer(rs.getInt(1));
                }
            }else{
                idEmpresa = rs.getInt(1);
            }
            stmt.close();
        }catch (SQLException ex) {
            Logger.getLogger(SQLServerEmpresaDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        } finally {
            SQLServerDAOFactory.desconecta(con);
        }
        
        return idEmpresa;
    }

    /**
     * Método que lista las empresas existentes.
     * @author: Sara y Alvaro
     * @return Devuelve una lista con ellos.
     */
    public ArrayList<Empresa> listarEmpresas() throws GestorFormacionExcepcion {
        ArrayList<Empresa> empresas = new ArrayList<Empresa>();
        Empresa empresa = new Empresa();
        Connection con;

        try {
            con = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerEmpresaDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }

        try {
            PreparedStatement stmt = con.prepareStatement("SELECT EmpId, EmpCIF, EmpDir, EmpTlf1, EmpTlf2, EmpMail, EmpWeb, EmpNom, EmpObserv FROM empresa");
            ResultSet rs = stmt.executeQuery();
            while (rs.next()) {
                empresa = instanciarEmpresa(rs);
                empresas.add(empresa);
            }
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerEmpresaDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        } finally {
            SQLServerDAOFactory.desconecta(con);
        }
        
        return empresas;
    }
}